export let Vue

class Store {
    constructor(options) {
        let state = options.state
        let getters = options.getters
        let mutations = options.mutations
        let actions = options.actions

        // 这里期望的状态是响应式的，状态变化需要更新视图
        // this.state = state

        // vuex是完全依赖于vue。如果在别的地方使用，是没法收集watcher。vuex只能为vue服务
        this._vm = new Vue({
            data: {
                // 在定义数据的时候，vue会对带$或者_的做退让，不进行代理
                $$state: state
            }
        })
        this.getters = {}

        Object.keys(getters).forEach(getterKey => {
            Object.defineProperty(this.getters, getterKey, {
                get() {
                    return getters[getterKey](state)
                }
            })
        })
    }

    get state() {
        return this._vm._data.$$state
    }
}

const install = _Vue => {
    Vue = _Vue
    Vue.mixin({
        beforeCreate() {
            // 让所有组件都定义一个$store，属性可以用来获取store实例
            if(this.$options.store) {
                this.$store = this.$options.store
            } else if(this.$parent && this.$parent.$store) {
                this.$store = this.$parent.store
            }
        },
    })
}

export default {
    Store,
    install
}